From 95a4eff6baddb174ef5ff8384250bd8c1e6e1f32 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 24 Jul 2018 20:23:20 +0200 Subject: [PATCH] render: Make gtk_render_icon() use the snapshot API This removes a lot of duplicated code. --- gtk/gtkrender.c | 26 +++++++------ gtk/gtkrendericon.c | 75 -------------------------------------- gtk/gtkrendericonprivate.h | 5 --- 3 files changed, 15 insertions(+), 91 deletions(-) diff --git a/gtk/gtkrender.c b/gtk/gtkrender.c index 8870518cfa..4162812dc5 100644 --- a/gtk/gtkrender.c +++ b/gtk/gtkrender.c @@ -629,17 +629,21 @@ gtk_render_icon (GtkStyleContext *context, gdouble x, gdouble y) { - cairo_surface_t *surface; - - g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); - g_return_if_fail (cr != NULL); - - surface = gdk_texture_download_surface (texture); + GtkSnapshot *snapshot; + GskRenderNode *node; - gtk_css_style_render_icon_surface (gtk_style_context_lookup_style (context), - cr, - surface, - x, y); + snapshot = gtk_snapshot_new (); + gtk_css_style_snapshot_icon_paintable (gtk_style_context_lookup_style (context), + snapshot, + GDK_PAINTABLE (texture), + x, y, + FALSE); + node = gtk_snapshot_free_to_node (snapshot); + if (node == NULL) + return; - cairo_surface_destroy (surface); + cairo_save (cr); + cairo_translate (cr, x, y); + gsk_render_node_draw (node, cr); + cairo_restore (cr); } diff --git a/gtk/gtkrendericon.c b/gtk/gtkrendericon.c index 5a6be7510f..2d2dfa05f5 100644 --- a/gtk/gtkrendericon.c +++ b/gtk/gtkrendericon.c @@ -96,81 +96,6 @@ gtk_css_style_snapshot_icon (GtkCssStyle *style, gtk_snapshot_pop (snapshot); } -static gboolean -get_surface_extents (cairo_surface_t *surface, - GdkRectangle *out_extents) -{ - cairo_t *cr; - gboolean result; - - cr = cairo_create (surface); - result = gdk_cairo_get_clip_rectangle (cr, out_extents); - cairo_destroy (cr); - - return result; -} - -void -gtk_css_style_render_icon_surface (GtkCssStyle *style, - cairo_t *cr, - cairo_surface_t *surface, - double x, - double y) -{ - const GtkCssValue *shadows; - graphene_matrix_t graphene_matrix; - cairo_matrix_t matrix, transform_matrix, saved_matrix; - GdkRectangle extents; - - g_return_if_fail (GTK_IS_CSS_STYLE (style)); - g_return_if_fail (cr != NULL); - g_return_if_fail (surface != NULL); - - shadows = gtk_css_style_get_value (style, GTK_CSS_PROPERTY_ICON_SHADOW); - - if (!get_surface_extents (surface, &extents)) - { - /* weird infinite surface, no special magic for you */ - cairo_set_source_surface (cr, surface, x, y); - _gtk_css_shadows_value_paint_icon (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_ICON_SHADOW), cr); - cairo_paint (cr); - return; - } - - cairo_get_matrix (cr, &saved_matrix); - cairo_translate (cr, x + extents.x, y + extents.y); - - if (gtk_css_transform_value_get_matrix (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_ICON_TRANSFORM), &graphene_matrix) && - graphene_matrix_is_2d (&graphene_matrix)) - { - cairo_pattern_t *pattern; - - graphene_matrix_to_2d (&graphene_matrix, - &transform_matrix.xx, &transform_matrix.yx, - &transform_matrix.xy, &transform_matrix.yy, - &transform_matrix.x0, &transform_matrix.y0); - /* XXX: Implement -gtk-icon-transform-origin instead of hardcoding "50% 50%" here */ - cairo_matrix_init_translate (&matrix, extents.width / 2, extents.height / 2); - cairo_matrix_multiply (&matrix, &transform_matrix, &matrix); - cairo_matrix_translate (&matrix, - extents.width / 2, - extents.height / 2); - if (cairo_matrix_invert (&matrix) != CAIRO_STATUS_SUCCESS) - { - g_assert_not_reached (); - } - cairo_matrix_translate (&matrix, extents.x, extents.y); - - pattern = cairo_pattern_create_for_surface (surface); - cairo_pattern_set_matrix (pattern, &matrix); - cairo_set_source (cr, pattern); - cairo_pattern_destroy (pattern); - - _gtk_css_shadows_value_paint_icon (shadows, cr); - cairo_paint (cr); - } - - cairo_set_matrix (cr, &saved_matrix); -} - void gtk_css_style_snapshot_icon_paintable (GtkCssStyle *style, GtkSnapshot *snapshot, diff --git a/gtk/gtkrendericonprivate.h b/gtk/gtkrendericonprivate.h index 4cb7628349..1514d295bd 100644 --- a/gtk/gtkrendericonprivate.h +++ b/gtk/gtkrendericonprivate.h @@ -35,11 +35,6 @@ void gtk_css_style_snapshot_icon (GtkCssStyle *style, double height, GtkCssImageBuiltinType builtin_type); -void gtk_css_style_render_icon_surface (GtkCssStyle *style, - cairo_t *cr, - cairo_surface_t *surface, - double x, - double y); void gtk_css_style_snapshot_icon_paintable (GtkCssStyle *style, GtkSnapshot *snapshot, GdkPaintable *paintable, -- 2.30.2